package com.hh.mybatisflex.service;

import cn.hutool.core.collection.CollUtil;
import com.hh.common.core.domain.BaseEntity;
import com.hh.common.core.page.PageDomain;
import com.hh.common.utils.StringUtils;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;

import java.util.List;

/**
 * Service接口
 *
 * @author hh
 * @date 2023-03-17
 */
public interface IBaseService<T extends BaseEntity> extends IService<T>
{

    /**
     * 查询包装器。
     *
     * @return 查询包装器
     */
    default QueryWrapper query() {
        return QueryWrapper.create();
    }


    /**
     * 根据查询条件分页查询数据。
     *
     * @param pageDomain 分页对象
     * @param entity 查询条件
     * @return 分页对象
     */
    default Page<T> selectPage(PageDomain pageDomain, T entity) {
        QueryWrapper query = buildWrapper(entity);
        if (StringUtils.isNotBlank(pageDomain.getOrderBy())) {
            query.orderBy(pageDomain.getOrderBy());
        }
        Page<T> page = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize());
        page = page(page, query);
        if (CollUtil.isEmpty(page.getRecords())) {
            page.setRecords(CollUtil.newArrayList());
        }
        return page;
    }

    /**
     * 查询列表
     *
     * @param entity 实体列表
     * @return 集合
     */
    default List<T> selectList(T entity) {
        QueryWrapper query = buildWrapper(entity);
        List<T> list = getMapper().selectListByQuery(query);
        if (CollUtil.isEmpty(list)) {
            return CollUtil.newArrayList();
        }
        return list;
    }

    default QueryWrapper buildWrapper(T entity) {
        return query();
    }

    /**
     * 新增
     * @param entity
     * @return
     */
    boolean add(T entity);

    /**
     * 先校验后修改
     *
     * @param entity 实体
     * @return 结果
     */
    boolean edit(T entity);

    /**
     * 批量更新
     * @param list
     * @return 更新数量
     */
    boolean batchUpdate(List<T> list);

}
